/**
 * TODO <br>
 * 0.2: weijj:2019年5月8日 上午10:27:44:TODO <br>
 * @author  weijj
 * @since 2019年5月8日 上午10:27:44
 * @date 2019年5月8日 上午10:27:44
 * @version 0.1 初始为0.1,后续变更则修改
 */
package com.irdstudio.efp.batch.service.impl.dw;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import com.irdstudio.basic.framework.core.constant.CurrencyConstant;
import com.irdstudio.basic.framework.core.constant.MonAlrmLvlEnums.MonAlrmLvlEnum;
import com.irdstudio.basic.framework.core.constant.SDicCertTypeEnum;
import com.irdstudio.basic.framework.core.util.DateTool;
import com.irdstudio.basic.framework.core.util.StringUtil;
import com.irdstudio.efp.batch.common.constant.BdLoanConstant;
import com.irdstudio.efp.batch.service.domain.TxtFileLoadBean;
import com.irdstudio.efp.batch.service.domain.dw.BdYxapplyBean;
import com.irdstudio.efp.batch.service.facade.dw.BdCtrLoanContBatchService;
import com.irdstudio.efp.batch.service.util.DueDataUtil;
import com.irdstudio.efp.batch.service.util.SDicMappingUtil;
import com.irdstudio.efp.batch.service.util.TxtFileLoadPlugin;
import com.irdstudio.efp.console.common.ConsoleConstant;
import com.irdstudio.efp.ctr.service.facade.CtrLoanContService;
import com.irdstudio.efp.ctr.service.vo.CtrLoanContVO;
import com.irdstudio.efp.loan.service.facade.AccoutErroTempService;
import com.irdstudio.efp.loan.service.facade.DwBaiduLoanRateTempService;
import com.irdstudio.efp.loan.service.facade.DwBaiduLoanTempService;
import com.irdstudio.efp.loan.service.facade.DwBaiduOpenTempService;
import com.irdstudio.efp.loan.service.vo.AccoutErroTempVO;
import com.irdstudio.efp.nls.service.facade.BdYxapplyTempService;

/**
 * 根据百度同步过来的用信申请文件信息临时表数据修改合同信息表
 * 
 * @author weijj
 * @since 2019年5月8日 上午10:27:44
 * @version 1.0
 */
@Service("bdCtrLoanContBatchService")
public class BdCtrLoanContBatchServiceImpl implements BdCtrLoanContBatchService {

	private static Logger logger = LoggerFactory.getLogger(BdCtrLoanContBatchServiceImpl.class);

	@Autowired
	@Qualifier("ctrLoanContService")
	private CtrLoanContService ctrLoanContService;// 合同信息

	@Autowired
	@Qualifier("bdYxapplyTempService")
	private BdYxapplyTempService bdYxapplyTempService;// 用信申请临时信息

	@Autowired
	@Qualifier("dwBaiduOpenTempService")
	private DwBaiduOpenTempService dwBaiduOpenTempService;// 贷款每日放款明细临时信息

	@Autowired
	@Qualifier("dwBaiduLoanTempService")
	private DwBaiduLoanTempService dwBaiduLoanTempService;// 日初借据信息临时信息

	@Autowired
	@Qualifier("dwBaiduLoanRateTempService")
	private DwBaiduLoanRateTempService dwBaiduLoanRateTempService;// 贷款利息费率临时信息

	@Autowired
	@Qualifier("accoutErroTempService")
	private AccoutErroTempService accoutErroTempService;// 错误信息

	// /**
	// * 根据百度同步过来的用信申请文件信息临时表数据修改合同信息表 <br>
	// * 0.1: weijj:2019年5月8日 上午10:32:21:新增 <br>
	// *
	// * @author weijj
	// * @since 2019年5月8日 上午10:32:21
	// * @date 2019年5月8日 上午10:32:21
	// * @version 0.1
	// */
	// @Override
	// public boolean batchUpdateCtrLoanCont() throws Exception {
	// // TODO Auto-generated method stub
	// boolean result = false;
	// long startTime = System.currentTimeMillis();
	// logger.info("同步用信申请文件信息文件数据到合同信息表：[" + DateTool.formatDate(new
	// Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始！");
	// // 可以配置参数
	// Integer pageSize = 1000;
	// try {
	// // 需要新增或者修改的合同信息
	// List<CtrLoanContVO> list = null;
	// // 分页信息
	// BdYxapplyTempVO pageInfo = new BdYxapplyTempVO();
	// // 新增或者修改的合同信息数量
	// int num = 0;
	// // 页数
	// int page = 1;
	// // pageSize初始化
	// if (pageSize > 0) {
	// pageInfo.setSize(pageSize);
	// } else {
	// pageInfo.setSize(1000);
	// }
	// final String createUser = "admin";
	// // 判断循环次数
	// int size = bdYxapplyTempService.queryCount();
	// String size_msg = "【合同信息表】数据量：" + size;
	// logger.info(size_msg, "message{}");
	// int loopCount = (size / pageInfo.getSize()) + 1;
	// for (int i = 0; i < loopCount; i++) {
	// // 分页查询【用信申请信息表】数据
	// List<BdYxapplyTempVO> tempList = bdYxapplyTempService.queryByPage(pageInfo);
	// list = new ArrayList<CtrLoanContVO>();
	// if (Objects.nonNull(tempList) && !tempList.isEmpty()) {
	// for (BdYxapplyTempVO bdYxapplyTempVO : tempList) {
	// if (BdLoanConstant.NO_0.equals(bdYxapplyTempVO.getIsblack())
	// || StringUtil.isNullorBank(bdYxapplyTempVO.getIsblack())) {
	// // 合同信息
	// CtrLoanContVO ctrLoanContVO = new CtrLoanContVO();
	// ctrLoanContVO.setContNo(bdYxapplyTempVO.getSessionid());
	// ctrLoanContVO.setSerno(bdYxapplyTempVO.getSessionid());
	// ctrLoanContVO.setContType(ConsoleConstant.CONT_TYPE_02);
	// ctrLoanContVO.setPrdId(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_CODE,
	// bdYxapplyTempVO.getIcode()));
	// ctrLoanContVO
	// .setPrdCode(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_CODE,
	// bdYxapplyTempVO.getIcode()));
	// // prd_name 产品名称 ICODE 百度分配的机构码
	// ctrLoanContVO
	// .setPrdName(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_NAME,
	// bdYxapplyTempVO.getIcode()));
	// ctrLoanContVO.setCusName(bdYxapplyTempVO.getName());
	// ctrLoanContVO.setCertType(SDicCertTypeEnum.IDCARD.getValue());
	// ctrLoanContVO.setCertCode(bdYxapplyTempVO.getPrcid());
	// ctrLoanContVO.setCurrencyType(CurrencyConstant.CNY);
	// if (!StringUtil.isNullorBank(bdYxapplyTempVO.getCashamount())) {
	// ctrLoanContVO.setApprovalAmt(new
	// BigDecimal(bdYxapplyTempVO.getCashamount()));
	// }
	// if (!StringUtil.isNullorBank(bdYxapplyTempVO.getCashamount())) {
	// ctrLoanContVO.setContAmt(new BigDecimal(bdYxapplyTempVO.getCashamount()));
	// }
	// ctrLoanContVO.setIrAdjustMode(BdLoanConstant.IR_ADJUST_MODE_1);
	// ctrLoanContVO.setAssureMeansMain(BdLoanConstant.ASSURE_MEANS_MAIN_00);
	// ctrLoanContVO.setUseDec(BdLoanConstant.LOAN_USE_TYPE_23);
	// ctrLoanContVO.setContState(BdLoanConstant.CONT_STATE_101);
	// ctrLoanContVO.setCreateUser(createUser);
	// ctrLoanContVO.setCreateTime(DateTool.getCurrentDateTime());
	// ctrLoanContVO.setLastUpdateUser(createUser);
	// ctrLoanContVO.setLastUpdateTime(DateTool.getCurrentDateTime());
	// ctrLoanContVO.setChannelCode(BdLoanConstant.BD_CHANNEL_NO);
	// list.add(ctrLoanContVO);
	// }
	// }
	// // 需要新增或者更新的合同信息
	// if (Objects.nonNull(list) && !list.isEmpty()) {
	// int updateSize = ctrLoanContService.insertOrUpdateCtrLoanCont(list);
	// num += updateSize;
	// }
	// }
	// pageInfo.setPage(++page);
	// }
	// String num_msg = "【合同信息表】插入或更新数据处理结果:" + num;
	// logger.info(num_msg, "message{}");
	// result = true;
	// } catch (Exception e) {
	// e.printStackTrace();
	// String tableName = "";
	// String errorMsg = "同步用信申请文件数据到合同信息表出错！";
	// String remark = "同步用信申请文件数据到合同信息表出错，错误信息：" + e.getMessage();
	// addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg,
	// remark);
	// logger.error(remark);
	// throw new Exception(remark);
	// }
	// long endTime = System.currentTimeMillis();
	// logger.info("同步用信申请文件数据到合同信息表：[" + DateTool.formatDate(new Date(endTime),
	// DateTool.PATTERN_DATETIME) + "]， 处理结束！");
	// logger.info("SERIOUS，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" +
	// result + "]！");
	// return result;
	//
	// }

	/**
	 * 根据百度同步过来的用信申请文件信息数据修改合同信息表 <br>
	 * 0.1: weijj:2019年5月8日 上午10:32:21:新增 <br>
	 * 
	 * @author weijj
	 * @since 2019年5月8日 上午10:32:21
	 * @date 2019年5月8日 上午10:32:21
	 * @version 0.1
	 */
	@Override
	public boolean batchUpdateCtrLoanCont(String fileUrl) throws Exception {
		// 处理结果
		boolean result = false;
		long startTime = System.currentTimeMillis();
		logger.info("同步用信申请文件信息文件数据到合同信息表：[" + DateTool.formatDate(new Date(startTime), DateTool.PATTERN_DATETIME) + "]， 处理开始！");
		try {
			TxtFileLoadPlugin txtFileLoadPlugin = new TxtFileLoadPlugin(fileUrl, "\u0002", "UTF-8", 0, 1000);
			List<TxtFileLoadBean> txtFileLoadList = txtFileLoadPlugin.run(new BdYxapplyBean());
			result = dueData(txtFileLoadList);
			if (txtFileLoadList.size() != 0) {
				while (!txtFileLoadList.get(txtFileLoadList.size() - 1).isReadedComplete) {
					txtFileLoadPlugin.setFirstRead(false);
					txtFileLoadList = txtFileLoadPlugin.run(new BdYxapplyBean());
					if (txtFileLoadList.size() == 0) {
						break;
					}
					result = dueData(txtFileLoadList);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "";
			String errorMsg = "同步用信申请临时数据到合同信息表出错！";
			String remark = "同步用信申请临时数据到合同信息表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
			throw new Exception(remark);
		}
		long endTime = System.currentTimeMillis();
		logger.info("同步用信申请临时数据到合同信息表：[" + DateTool.formatDate(new Date(endTime), DateTool.PATTERN_DATETIME) + "]， 处理结束！");
		logger.info("SERIOUS，耗时：[" + (endTime - startTime) / 1000.0 + "]秒，处理结果[" + result + "]！");
		return result;
	}

	/**
	 * 根据百度同步过来的用信申请文件信息数据初始化合同信息 <br>
	 * 0.1: weijj:2019年5月7日 下午3:02:37:新增 <br>
	 * 
	 * @author weijj
	 * @since 2019年5月7日 下午3:02:37
	 * @date 2019年5月7日 下午3:02:37
	 * @version 0.1
	 */
	public boolean dueData(List<TxtFileLoadBean> txtFileLoadList) {
		logger.info("同步用信申请文件数据到合同信息表加工处理开始！");
		// 需要新增或者修改的合同信息
		List<CtrLoanContVO> list = new ArrayList<CtrLoanContVO>();
		// 处理结果
		boolean result = false;
		// 新增或者修改的数量
		int num = 0;
		// 创建、修改用户
		final String createUser = "admin";
		try {
			for (int i = 0; i < txtFileLoadList.size(); i++) {
				BdYxapplyBean bdYxapplyBean = (BdYxapplyBean) txtFileLoadList.get(i);
				if (BdLoanConstant.NO_0.equals(bdYxapplyBean.getIsblack()) || StringUtil.isNullorBank(bdYxapplyBean.getIsblack())) {
					// 合同信息
					CtrLoanContVO ctrLoanContVO = new CtrLoanContVO();
					ctrLoanContVO.setContNo(bdYxapplyBean.getSessionid());
					ctrLoanContVO.setSerno(bdYxapplyBean.getSessionid());
					ctrLoanContVO.setContType(ConsoleConstant.CONT_TYPE_02);
					ctrLoanContVO.setPrdId(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_CODE, bdYxapplyBean.getIcode()));
					ctrLoanContVO.setPrdCode(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_CODE, bdYxapplyBean.getIcode()));
					// prd_name 产品名称 ICODE 百度分配的机构码
					ctrLoanContVO.setPrdName(SDicMappingUtil.getLocalSysDicVal(BdLoanConstant.PRD_NAME, bdYxapplyBean.getIcode()));
					ctrLoanContVO.setCusName(bdYxapplyBean.getName());
					ctrLoanContVO.setCertType(SDicCertTypeEnum.IDCARD.getValue());
					ctrLoanContVO.setCertCode(bdYxapplyBean.getPrcid());
					ctrLoanContVO.setCurrencyType(CurrencyConstant.CNY);
					if (!StringUtil.isNullorBank(bdYxapplyBean.getCashamount())) {
						ctrLoanContVO.setApprovalAmt(new BigDecimal(bdYxapplyBean.getCashamount()));
					}
					if (!StringUtil.isNullorBank(bdYxapplyBean.getCashamount())) {
						ctrLoanContVO.setContAmt(new BigDecimal(bdYxapplyBean.getCashamount()));
					}
					ctrLoanContVO.setIrAdjustMode(BdLoanConstant.IR_ADJUST_MODE_1);
					ctrLoanContVO.setAssureMeansMain(BdLoanConstant.ASSURE_MEANS_MAIN_00);
					ctrLoanContVO.setUseDec(BdLoanConstant.LOAN_USE_TYPE_23);
					ctrLoanContVO.setContState(BdLoanConstant.CONT_STATE_200);
					ctrLoanContVO.setSignDate(DueDataUtil.getApplyDateValue(bdYxapplyBean.getTrantime(), BdLoanConstant.NO_0));
					ctrLoanContVO.setCreateUser(createUser);
					ctrLoanContVO.setCreateTime(DateTool.getCurrentDateTime());
					ctrLoanContVO.setLastUpdateUser(createUser);
					ctrLoanContVO.setLastUpdateTime(DateTool.getCurrentDateTime());
					ctrLoanContVO.setChannelCode(BdLoanConstant.BD_CHANNEL_NO);
					list.add(ctrLoanContVO);
				}
			}
			if (list != null && !list.isEmpty()) {
				num = ctrLoanContService.insertOrUpdateCtrLoanCont(list);
			}
			String num_msg = "【合同信息表】插入或更新数据处理结果:" + num;
			logger.info(num_msg, "message{}");
			result = true;
		} catch (Exception e) {
			e.printStackTrace();
			String tableName = "";
			String errorMsg = "同步用信申请临时数据到合同信息表出错！";
			String remark = "同步用信申请临时数据到合同信息表出错，错误信息：" + e.getMessage();
			addErrorInfo(tableName, MonAlrmLvlEnum.SERIOUS.getEnname(), errorMsg, remark);
			logger.error(remark);
		} finally {
			// 清空信息
			list = null;
			txtFileLoadList = null;
		}
		logger.info("同步用信申请文件数据到合同信息表加工处理结束！");
		return result;
	}

	/**
	 * 
	 * 记录异常信息 <br>
	 * 0.1:weijj:2019年5月7日 上午11:31:23:新增 <br>
	 * 
	 * @author weijj
	 * @since 2019年5月7日 上午11:31:23
	 * @date 2019年5月7日 上午11:31:23
	 * @version 0.1
	 */
	private void addErrorInfo(String tableName, String errorType, String errorMsg, String remark) {
		AccoutErroTempVO accoutErroTempVO = new AccoutErroTempVO();
		// 表名
		accoutErroTempVO.setTableName(tableName);
		// 错误级别
		accoutErroTempVO.setErroType(errorType);
		// 错误信息
		accoutErroTempVO.setErroMsg(errorMsg);
		// 备注
		accoutErroTempVO.setRemark(remark);
		// 创建时间
		accoutErroTempVO.setCreateData(DateTool.getCurrentDateTime());
		// 修改时间
		accoutErroTempVO.setLastModifyTime(DateTool.getCurrentDateTime());
		// 记录异常信息
		accoutErroTempService.insert(accoutErroTempVO);
	}

}
